use crate::List::{Cons, Nil};
use mybox;
use rc_list ;
use rc_list2 ;


fn main() {
    // println!("Hello, world!");
    let b = Box::new(5);
    println!("b = {}", b);

    // 测试 Box 只能指针
    print_list();

    // 传入切片
    hello("Rust 1 ");
    // 传入我创建的 MyBox
    hello(&mybox::MyBox::new(String::from("Rust 2 ")));
    // hello(Box::new(String::from("Rust 2 ")));
    hello(&String::from("Rust 3"));

    println!("==============");
    rc_list::tail_rc_example();

    println!("==============");
    rc_list2::tail_rc_example();
}

/// 建立一个函数输出字符串
fn hello(name:&str) {
    println!("Hello {}.", name);
}

#[derive(Debug)]
enum List {
    Cons(i32, Box<List>),
    Nil,
}


/// 递归链表的测试，给它打印出来
fn print_list () {
    let list = Cons(1,
        Box::new(Cons(2,
            Box::new(Cons(3,
                Box::new(Nil))))));
    println!("list = {:?}", list);
}


#[test] // 测试引用和解引用
fn test_ref_and_descontraedctruct_ref() {
    let x = 5;
    let y = &x;
    let b = Box::new(x);
    assert_eq!(5, x);
    // assert_eq!(5, y); // 如果不使用 *y 进行解引用，下面的断言无法执行。
    assert_eq!(5, *y); // 需要解引用
    assert_eq!(5, *b); // 用智能指针也需要解引用，为什么Box<T>也可以进行解引用操作呢？
}


